﻿// Hopscotch POJ - 3050.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <set>
#include <cstring>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3050
/*
奶牛以非传统的方式玩孩子的跳房子游戏。它们创建了一个与x轴和y轴平行的5x5数字矩阵，而不是线性的带编号的方框供其跳跃。

然后，它们灵巧地跳到网格中的任何数字，并向前、向后、向右或向左跳跃（不能对角线跳跃）到网格中的另一个数字。
它们再次跳跃（同样的规则）到一个数字（可能是已经访问过的数字）。

通过在网格内总共进行五次跳跃，它们创建了一个六位数的整数（可能有前导零，如000201）。

确定以这种方式可以构建的不同整数的数量。
输入：

第1至第5行：5个整数，每行一个。 输出：
第1行：可以构造的不同整数的数量。

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1


15

输出细节：
可以构建的整数有：111111k、111112、111121、111211、111212、112111、112121、121111、121112、121211、121212、211111k、211121、212111和212121。
没有其他可能的值。
*/

const int N = 6;
int gra[N][N];
vector<int> v;
set<int> ans;

void dfs(int x, int y,int step) {
	if (step == 6) {
		int n = 0;
		for (int i = 0; i < v.size(); i++) {
			n = n * 10+v[i];
		}
		ans.insert(n);
		return;
	}

	v.push_back(gra[x][y]);
	if (x - 1 >= 0 && x - 1 < 5) {
		dfs(x - 1, y, step + 1);
	}
	if (x + 1 >= 0 && x + 1 < 5) {
		dfs(x + 1, y, step + 1);
	}

	if (y - 1 >= 0 && y - 1 < 5) {
		dfs(x, y - 1, step + 1);
	}
	if (y + 1 >= 0 && y + 1 < 5) {
		dfs(x, y + 1, step + 1);
	}
	v.pop_back();
	return;
}

int main()
{
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			cin >> gra[i][j];
		}
	}
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			dfs(i, j, 0);
		}
	}

	cout << ans.size() << endl;
	
	/*for (auto& e : ans) {
		cout << e << " ";
	}*/

	return 0;
}
 